const path = require('path');
const fs = require('fs');
const File = require('../models/File');
const config = require('../config/default');
const { successResponse, errorResponse, paginationResponse } = require('../utils/response');
const logger = require('../utils/logger');

// 上传文件
exports.uploadFile = async (req, res) => {
  try {
    if (!req.file) {
      return errorResponse(res, '没有文件被上传', 400);
    }

    // 创建文件记录
    const file = new File({
      filename: req.file.filename,
      originalname: req.file.originalname,
      mimetype: req.file.mimetype,
      size: req.file.size,
      path: req.file.path,
      uploadedBy: req.user.id,
      description: req.body.description || '',
      category: req.body.category || 'other',
      tags: req.body.tags ? req.body.tags.split(',').map(tag => tag.trim()) : []
    });

    await file.save();
    
    return successResponse(res, file, '文件上传成功', 201);
  } catch (error) {
    logger.error(`文件上传失败: ${error.message}`);
    return errorResponse(res, '文件上传失败', 500);
  }
};

// 获取文件列表
exports.getFiles = async (req, res) => {
  try {
    const page = parseInt(req.query.page) || 1;
    const limit = parseInt(req.query.limit) || 10;
    const skip = (page - 1) * limit;
    const sort = req.query.sort || 'createdAt';
    const order = req.query.order === 'asc' ? 1 : -1;
    
    // 查询条件
    const filter = {};
    if (req.query.filename) {
      filter.filename = { $regex: req.query.filename, $options: 'i' };
    }
    if (req.query.originalname) {
      filter.originalname = { $regex: req.query.originalname, $options: 'i' };
    }
    if (req.query.mimetype) {
      filter.mimetype = { $regex: req.query.mimetype, $options: 'i' };
    }
    if (req.query.category) {
      filter.category = req.query.category;
    }
    if (req.query.uploadedBy) {
      filter.uploadedBy = req.query.uploadedBy;
    }

    // 如果不是管理员，只能看到自己上传的文件
    if (req.user.role !== 'admin') {
      filter.uploadedBy = req.user.id;
    }

    // 查询文件总数
    const total = await File.countDocuments(filter);
    
    // 查询文件列表
    const files = await File.find(filter)
      .populate('uploadedBy', 'username name')
      .sort({ [sort]: order })
      .skip(skip)
      .limit(limit);

    return paginationResponse(res, files, page, limit, total);
  } catch (error) {
    logger.error(`获取文件列表失败: ${error.message}`);
    return errorResponse(res, '获取文件列表失败', 500);
  }
};

// 获取单个文件信息
exports.getFile = async (req, res) => {
  try {
    const file = await File.findById(req.params.id)
      .populate('uploadedBy', 'username name');
    
    if (!file) {
      return errorResponse(res, '文件不存在', 404);
    }

    // 如果不是管理员且不是文件上传者，不能查看
    if (req.user.role !== 'admin' && file.uploadedBy._id.toString() !== req.user.id) {
      return errorResponse(res, '没有权限查看此文件', 403);
    }

    return successResponse(res, file, '获取文件成功');
  } catch (error) {
    logger.error(`获取文件失败: ${error.message}`);
    return errorResponse(res, '获取文件失败', 500);
  }
};

// 下载文件
exports.downloadFile = async (req, res) => {
  try {
    const file = await File.findById(req.params.id);
    
    if (!file) {
      return errorResponse(res, '文件不存在', 404);
    }

    // 如果不是管理员且不是文件上传者，不能下载
    if (req.user.role !== 'admin' && file.uploadedBy.toString() !== req.user.id) {
      return errorResponse(res, '没有权限下载此文件', 403);
    }

    // 检查文件是否存在
    if (!fs.existsSync(file.path)) {
      return errorResponse(res, '文件物理路径不存在', 404);
    }

    // 设置响应头
    res.setHeader('Content-Type', file.mimetype);
    res.setHeader('Content-Disposition', `attachment; filename="${encodeURIComponent(file.originalname)}"`);

    // 创建文件读取流
    const fileStream = fs.createReadStream(file.path);
    fileStream.pipe(res);
  } catch (error) {
    logger.error(`下载文件失败: ${error.message}`);
    return errorResponse(res, '下载文件失败', 500);
  }
};

// 删除文件
exports.deleteFile = async (req, res) => {
  try {
    const file = await File.findById(req.params.id);
    
    if (!file) {
      return errorResponse(res, '文件不存在', 404);
    }

    // 如果不是管理员且不是文件上传者，不能删除
    if (req.user.role !== 'admin' && file.uploadedBy.toString() !== req.user.id) {
      return errorResponse(res, '没有权限删除此文件', 403);
    }

    // 尝试删除物理文件
    try {
      if (fs.existsSync(file.path)) {
        fs.unlinkSync(file.path);
      }
    } catch (err) {
      logger.warn(`删除物理文件失败: ${err.message}`);
    }

    // 删除数据库记录
    await file.remove();
    
    return successResponse(res, null, '删除文件成功');
  } catch (error) {
    logger.error(`删除文件失败: ${error.message}`);
    return errorResponse(res, '删除文件失败', 500);
  }
}; 